/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package energiebedrijf.Classes;

import java.sql.*;
import java.util.ArrayList;

/**
 * Een manager om percelen mee op te halen/wijzigen/toevoegen/verwijderen
 * @author Robert
 * 
 */
public class ManagerPerceel {
//private Manager manager = new Manager ();
    private ArrayList<Perceel> PerceelLijst = new ArrayList<Perceel>();

    /**
     * Lege contructor
     */
    public ManagerPerceel() {
    }

    /**
     * Zoekt perceel adhv perceel postcode
     * @param perceelCode De postcode
     * @return Het gevonden perceel of null
     */
    public Perceel findPerceel(String perceelCode) {
        for (Perceel p : getPerceelLijst()) {
            if (p.getPostcode().equalsIgnoreCase(perceelCode)) {
                return p;
            }
        }
        return null;
    }

    /**
     * Zoekt het perceel adhv perceel id
     * @param PerceelID Het perceel id
     * @return Het gevonden perceel of null
     */
    public Perceel findPerceel(int PerceelID) {
        for (Perceel p : getPerceelLijst()) {
            if (p.getPerceelId() == PerceelID) {
                return p;
            }
        }

        return null;
    }

    /**
     * Zoekt de percelen die bij een klant id horen
     * @param KlantID Het klant id
     * @return Een array list met Perceel objecten
     */
    public ArrayList<Perceel> GetKlantPercelen(int KlantID) {
        ArrayList<Perceel> tmpPercelen = new ArrayList<Perceel>();

        for (Perceel p : getPerceelLijst()) {
            if (p.getKlantId() == KlantID) {
                tmpPercelen.add(p);
            }
        }

        return tmpPercelen;
    }

    /**
     * Slaat alle bestaande percelen op en voegt nieuwe percelen toe
     * @return True als het gelukt is, anders false
     */
    public boolean saveAll() {
        
        //Initialiseer de database connectie
        DatabaseConn objCn = new DatabaseConn();
        Connection con = objCn.GetDatabaseConnection();
        
        // Loop alle perceel af en bewaar wijzigingen en voeg nieuwe klant toe.
        for (Perceel p : getPerceelLijst()) {
            try {
                PreparedStatement cmd1 = null;
                // Als perceel al in db zat, voer dan een update uit, anders een insert.
                if (p.getPerceelId() == -1) {
                    cmd1 = con.prepareStatement("INSERT INTO perceel (klant_id, straatnaam, huisnummer, postcode, plaats) VALUES (?, ?, ?, ?, ?)");
                    cmd1.setInt(1, p.getKlantId());
                    cmd1.setString(2, p.getStraatnaam());
                    cmd1.setString(3, p.getHuisnummer());
                    cmd1.setString(4, p.getHuisnummer());
                    cmd1.setString(5, p.getPlaats());
                } else if (p.getIsChanged()) {
                    //Alleen opslaan als het perceel gewijzigd is
                    cmd1 = con.prepareStatement("UPDATE perceel SET straatnaam=?, huisnummer=?, postcode=?, plaats=? WHERE perceel_id=?;");
                    cmd1.setString(1, p.getStraatnaam());
                    cmd1.setString(2, p.getHuisnummer());
                    cmd1.setString(3, p.getPostcode());
                    cmd1.setString(4, p.getPlaats());
                    cmd1.setInt(5, p.getPerceelId());
                }
                
                if (cmd1 != null) {
                    //Voer query uit
                    cmd1.executeUpdate();
                    con.commit();
                    cmd1.close();

                    //Als het een nieuw record is haal id op uit de database
                    if (p.getPerceelId() == -1) {
                        Statement cmd = con.createStatement();
                        ResultSet rs = cmd.executeQuery("SELECT MAX(perceel_id) FROM perceel");
                        p.setPerceelId(rs.getInt(0));
                    }
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
                return false;
            }
        }

        try {
            con.commit();
            con.close();
        } catch (SQLException ex) {
            System.out.println("Fout: " + ex.getMessage());
        }
        
        //Geef aan dat het goed gegaan is
        objCn = null;
        return true;
    }

    /**
     * Haalt alle percelen op uit de database
     */
    public void GetAll() {
        this.setPerceelLijst(new ArrayList<Perceel>());// this.PerceelLijst(new ArrayList<Perceel>());

        try {
            //Initialiseer de database connectie
            DatabaseConn objCn = new DatabaseConn();
            Connection con = objCn.GetDatabaseConnection();

            Statement cmd = con.createStatement();
            ResultSet rs = cmd.executeQuery("SELECT perceel_id, klant_id, straatnaam, huisnummer, postcode, plaats, meteropname, factuurdatum FROM perceel ORDER BY perceel_id");

            while (rs.next()) {
                Perceel p = new Perceel();
                p.setPerceelId(rs.getInt(1));
                p.setKlantId(rs.getInt(2));
                p.setStraatnaam(rs.getString(3));
                p.setHuisnummer(rs.getString(4));
                p.setPostcode(rs.getString(5));
                p.setPlaats(rs.getString(6));
                p.setMeteropname(rs.getDate(7));
                p.setFactuurDatum(rs.getDate(8));
                this.getPerceelLijst().add(p);
            }

            con.close();
            objCn = null;
        } catch (SQLException ex) {
            System.out.println("Fout: " + ex.getMessage());
        }
    }

    /**
     * Verwijderd alle aangegeven percelen uit de database en uit de lijst
     * @param VerwijderLijst De lijst met te verwijderen percelen
     */
    public void RemoveAll(ArrayList<Perceel> VerwijderLijst) {
        try {
            //Initialiseer de database connectie
            DatabaseConn objCn = new DatabaseConn();
            Connection con = objCn.GetDatabaseConnection();

            for (Perceel p : VerwijderLijst) {
                Statement cmd = con.createStatement();
                cmd.execute("DELETE FROM perceel WHERE perceel_id=" + Integer.toString(p.getPerceelId()));
                con.commit();
                this.getPerceelLijst().remove(p);
            }

            con.commit();
            con.close();
            objCn = null;
        } catch (SQLException ex) {
            System.out.println("Fout: " + ex.getMessage());
        }
    }

    /**
     * Haalt de lijst met percelen op
     * @return Een array list met alle percelen!
     */
    public ArrayList<Perceel> getPerceelLijst() {
        return PerceelLijst;
    }

    /**
     * Stelt de lijst met percelen in
     * @param PerceelLijst De lijst met percelen
     */
    public void setPerceelLijst(ArrayList<Perceel> PerceelLijst) {
        this.PerceelLijst = PerceelLijst;
    }
}

